package com.platform.acl.service.impl;

import com.platform.acl.entity.User;
import com.platform.acl.service.PermissionService;
import com.platform.acl.service.UserService;
import com.platform.spring_security.entity.SecurityUser;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author CZF
 * @create 2022-03-01 16:02
 */


/**
 * 继承UserDetailsService的接口，作用：
 *   一、 根据用户名，返回给 springsecurity 数据库中的 user 对象 以及这个user所拥有的的权限
 *   二、 springsecurity 会利用返回的 securityUser（继承了Userdetail）做：
 *      ① 根据前端请求提供的用户名和密码，验证 用户名和密码是否正确 （验证过程springsecurity会自动完成）
 *      ② 根据用户名在数据库中查找该用户的权限，给springsecurity进行封装，然后springsecurity会返回给前端（需要写实现类）
 */
@Service("userDetailsService")  //放入ioc中，让springsecurity可以注入使用
public class UserDetailsServiceImpl implements UserDetailsService {

    @Autowired
    private UserService userService;

    @Autowired
    private PermissionService permissionService;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userService.selectByUsername(username); //根据用户名（username）调用userService，查数据库是否存在此用户

        System.out.println("UserDetailsServiceImpl执行");
        // 判断用户是否存在
        if (null == user){
            throw new UsernameNotFoundException("用户名不存在！用户名或密码错误");
        }
        //springsecurity 中 自定义的 User
        com.platform.spring_security.entity.User curUser = new com.platform.spring_security.entity.User();
        BeanUtils.copyProperties(user,curUser);
        curUser.setUsername(user.getId());

                                    //TODO 获取用户权限列表的实现类还没写
        List<String> authorities = permissionService.selectPermissionValueByUserId(user.getId());
        //返回继承 Userdetail 的SecurityUser
        SecurityUser securityUser = new SecurityUser(curUser);
        securityUser.setPermissionValueList(authorities);
        return securityUser;
    }
}
